package com.codejiwei.core.graphx

import org.apache.spark.SparkContext
import org.apache.spark.graphx.{Edge, Graph}

object GraphX_ConnectedComponents {
  def main(args: Array[String]): Unit = {

    // 创建 SparkContext
    val sc = new SparkContext("local", "GraphConnectedComponentsExample")

    // 创建一个简单的图
    val vertices = sc.parallelize(Array((1L, "Alice"), (2L, "Bob"), (3L, "Charlie"), (4L, "David"), (5L, "Eve")))
    val edges = sc.parallelize(Array(
      Edge(1L, 2L, 1), // 边1: Alice -> Bob，权重为1
      Edge(2L, 3L, 1), // 边2: Bob -> Charlie，权重为1
      Edge(3L, 1L, 1), // 边3: Charlie -> Alice，权重为1
      Edge(4L, 5L, 1) // 边4: David -> Eve，权重为1
    ))

    val graph: Graph[String, Int] = Graph(vertices, edges, "default")

    // 查找连通分量
    val connectedComponentsGraph = graph.connectedComponents()

    // 输出每个顶点所属的连通分量
    /**
     * 算法会从顶点 1 开始探索，发现顶点 1、2 和 3 可以相互到达，因此它们被划分为同一个连通分量，并且被赋予相同的连通分量标识符，即标识符为 1。
     * 而顶点 4 和 5 没有与其他顶点相互连接，因此它们被分别划分为两个单独的连通分量，分别被赋予不同的标识符，即标识符为 4 和 5。
     * */
    connectedComponentsGraph.vertices.collect().foreach { case (vertexId, componentId) =>
      println(s"Vertex $vertexId belongs to connected component $componentId")
    }

  }
}
